home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 091 < prev    next >
Text File  |  1995-03-31  |  57KB  |  1,589 lines

  1. C.S.M.P. Digest             Fri, 31 Mar 95       Volume 3 : Issue 91
  2.  
  3. Today's Topics:
  4.  
  5.         Communications Toolbox
  6.         Displaying INIT icons (followup)
  7.         Help with Macintosh Serial Driver
  8.         How to write-read files
  9.         Large Resource Files
  10.         Making an Edit Text Inactive
  11.         Need help learning Handles -- Pascal
  12.         OSAExecute and AS subroutines
  13.         [Ann] FREE QuickView Development Kit
  14.         [HELP] How would I add to the Help Menu?
  15.  
  16.  
  17.  
  18. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  19. (pottier@clipper.ens.fr).
  20.  
  21. The digest is a collection of article threads from the internet newsgroup
  22. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  23. regularly and want an archive of the discussions.  If you don't know what a
  24. newsgroup is, you probably don't have access to it.  Ask your systems
  25. administrator(s) for details.  If you don't have access to news, you may
  26. still be able to post messages to the group by using a mail server like
  27. anon.penet.fi (mail help@anon.penet.fi for more information).
  28.  
  29. Each issue of the digest contains one or more sets of articles (called
  30. threads), with each set corresponding to a 'discussion' of a particular
  31. subject.  The articles are not edited; all articles included in this digest
  32. are in their original posted form (as received by our news server at
  33. nef.ens.fr).  Article threads are not added to the digest until the last
  34. article added to the thread is at least two weeks old (this is to ensure that
  35. the thread is dead before adding it to the digest).  Article threads that
  36. consist of only one message are generally not included in the digest.
  37.  
  38. The digest is officially distributed by two means, by email and ftp.
  39.  
  40. If you want to receive the digest by mail, send email to listserv@ens.fr
  41. with no subject and one of the following commands as body:
  42.     help                                Sends you a summary of commands
  43.     subscribe csmp-digest Your Name     Adds you to the mailing list
  44.     signoff csmp-digest                 Removes you from the list
  45. Once you have subscribed, you will automatically receive each new
  46. issue as it is created.
  47.  
  48. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  49. Questions related to the ftp site should be directed to
  50. scott.silver@dartmouth.edu.
  51.  
  52. -------------------------------------------------------
  53.  
  54. >From mbayme@bih.harvard.edu (Michael Bayme)
  55. Subject: Communications Toolbox
  56. Date: Tue, 07 Mar 1995 13:11:35 -0500
  57. Organization: Beth Israel Hospital Boston Department of Surgery
  58.  
  59. What's the deal with the Comm Toolbox? Is it going to remain part of the
  60. system? How come there's no sample programs on the apple server - they
  61. used to have something called 'surfer'? Is there a NIM-Comm Toolbox?
  62. Thanks.
  63.  
  64. Beth Israel Hospital Boston, Department of Surgery
  65. (617) 735-4700
  66.  
  67. +++++++++++++++++++++++++++
  68.  
  69. >From scouten@metrowerks.com (Eric Scouten)
  70. Date: Wed, 08 Mar 1995 16:57:55 -0600
  71. Organization: metrowerks, inc.
  72.  
  73. In article <mbayme-0703951311350001@bayme.bih.harvard.edu>,
  74. mbayme@bih.harvard.edu (Michael Bayme) wrote:
  75.  
  76. > What's the deal with the Comm Toolbox? Is it going to remain part of the
  77. > system? How come there's no sample programs on the apple server - they
  78. > used to have something called 'surfer'? Is there a NIM-Comm Toolbox?
  79. > Thanks.
  80.  
  81. CTB will remain part of the system software and will be enhanced (as part
  82. of Copland) to work with/take advantage of Open Transport in a logical
  83. manner.
  84.  
  85. There is no NIM-Comm Toolbox, but the CTB is documented in a volume titled
  86. "Inside the Macintosh Communications Toolbox." I don't have it handy, else
  87. I'd give you the ISBN.
  88.  
  89. Dunno what became of Surfer.
  90.  
  91. -es
  92.  
  93. __________________________________________________________________________
  94. Eric Scouten                                       Constructor Constructor
  95. scouten@metrowerks.com                                     Metrowerks, Inc.
  96.  
  97.                OUT OF TOWN March 4-7: limited net access
  98.  
  99. They [Murphy's] must optimize their grease for onion rings.
  100.    -Jon Roma
  101.  
  102. +++++++++++++++++++++++++++
  103.  
  104. >From kidsnoopy@aol.com (KID SNOOPY)
  105. Date: 14 Mar 1995 17:46:55 -0500
  106. Organization: America Online, Inc. (1-800-827-6364)
  107.  
  108. Just picked up a copy the ISBN is 0-201-57775-5
  109.  
  110. It has lots of good sample code!
  111.  
  112. Tom Harkins
  113.  
  114. ---------------------------
  115.  
  116. >From pottier@galion.ens.fr (Francois Pottier)
  117. Subject: Displaying INIT icons (followup)
  118. Date: 11 Mar 1995 15:46:03 GMT
  119. Organization: Ecole Normale Superieure, PARIS, France
  120.  
  121. Hello,
  122.  
  123. Oops! I found a severe bug in the code I posted yesterday. I should
  124. have allocated four more bytes of storage at the end of the QuickDraw
  125. globals; QuickDraw wants to store a pointer to its globals there.
  126.  
  127. Amusingly, this is only a problem on 68K Macs; on PowerMacs it works just
  128. fine, probably because the way A5 worlds work is different on PowerMacs. This
  129. explains why I didn't find the bug at first.
  130.  
  131. Happy patching
  132.  
  133. --
  134. Francois
  135. pottier@dmi.ens.fr
  136. http://acacia.ens.fr:8080/home/pottier/index.html
  137.  
  138. -- 
  139. Francois Pottier                                            pottier@dmi.ens.fr
  140. - ----------------------------------------------------------------------------
  141. Check my WWW page at http://acacia.ens.fr:8080/home/pottier/index.html ...
  142.  
  143. ---------------------------
  144.  
  145. >From car11@pop2.cwru.edu (Chad A. Ryan)
  146. Subject: Help with Macintosh Serial Driver
  147. Date: Wed, 15 Mar 95 23:22:42 GMT
  148. Organization: Case Western Reserve University
  149.  
  150.  
  151. I am currently developing an interface between a Casio digital diary and
  152. a Macintosh.  I am using the Serial Driver to transfer the data through the
  153. serial modem port.  I have no problem opening or closing the port, writing
  154. to the port, or changing the default settings for the port but when I try to
  155. read from the port I have problems.
  156.  
  157. To big problem is that I can only read 63 bytes.  I call the "SerGetBuf"
  158. function to get the number of bytes in the buffer.  If it is less than 63
  159. bytes it returns the correct value but anything more than that and it returns
  160. 63.  I have also tried getting the number of bytes in the input buffer
  161. by calling the "PBStatus" and "Status" functions and they also only
  162. return 63 bytes.
  163.  
  164. I am certain that it is not the Casio that has the problem because even
  165. if I connect the transmit pin directly to the receive I have the same problem
  166. but with an interesting twist:  It actually reads the entire string that I sent
  167. even if it is longer than 63 bytes but it tells me that it only read 63.
  168.  
  169. If anyone has any clue what I could be doing wrong I would appreciate any
  170. help you can offer.
  171.  
  172. Thanks in advance -
  173.  
  174. Chad Ryan
  175. car11@po.cwru.edu
  176. ryan@snowhite.eeap.cwru.edu
  177.  
  178.  
  179. +++++++++++++++++++++++++++
  180.  
  181. >From David Shortt <wyatt@wyatt.com>
  182. Date: 16 Mar 1995 06:31:28 GMT
  183. Organization: RAIN Public Access Internet (805) 967-RAIN
  184.  
  185. car11@pop2.cwru.edu (Chad A. Ryan) wrote:
  186. >
  187. > I am currently developing an interface between a Casio digital diary and
  188. > a Macintosh.  I am using the Serial Driver to transfer the data through the
  189. > serial modem port.  I have no problem opening or closing the port, writing
  190. > to the port, or changing the default settings for the port but when I try to
  191. > read from the port I have problems.
  192. > To big problem is that I can only read 63 bytes.  I call the "SerGetBuf"
  193. > function to get the number of bytes in the buffer.  If it is less than 63
  194. > bytes it returns the correct value but anything more than that and it returns
  195. > 63.  I have also tried getting the number of bytes in the input buffer
  196. > by calling the "PBStatus" and "Status" functions and they also only
  197. > return 63 bytes.
  198. > I am certain that it is not the Casio that has the problem because even
  199. > if I connect the transmit pin directly to the receive I have the same problem
  200. > but with an interesting twist:  It actually reads the entire string that I sent
  201. > even if it is longer than 63 bytes but it tells me that it only read 63.
  202. > If anyone has any clue what I could be doing wrong I would appreciate any
  203. > help you can offer.
  204. > Thanks in advance -
  205. > Chad Ryan
  206. > car11@po.cwru.edu
  207. > ryan@snowhite.eeap.cwru.edu
  208.  
  209. >From Inside Mac, volume II, p. 246:  "Each input driver's buffer can 
  210. initially hold up to 64 characters, but your application can specify
  211. a larger buffer if necessary."
  212.  
  213. You may be using the default buffer of 64 characters and not reading
  214. fast enough to prevent a software overflow.  If this is the case,
  215. you should see the "cumErrs" byte of a SerStaRec record contain the
  216. value 1 after a call to SerStatus.  The fix is to set a longer buffer
  217. before reading, something like this:
  218.  
  219. type
  220.   myBufType = packed array[1..1024] of char; {or however big you need}
  221.   pMyBufType = ^myBufType;
  222. var
  223.   myBuf: pMyBufType;
  224. begin
  225.   myBuf:= pMyBufType(NewPtr(SizeOf(myBufType)));
  226.   
  227.   ...  {open serial drivers, get refNum of port, etc.}
  228.  
  229.   SerSetBuf(refNum, @myBuf[1], 1024);
  230.  
  231.   ...  {use port normally at this point}
  232. end;
  233.  
  234. I hope this helps.
  235.  
  236. Dave Shortt
  237. wyatt@wyatt.com
  238.  
  239.  
  240.  
  241.  
  242. +++++++++++++++++++++++++++
  243.  
  244. >From wysocki@netcom.com (Chris Wysocki)
  245. Date: Fri, 17 Mar 1995 01:29:59 GMT
  246. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  247.  
  248. In article <3k7t0o$cha@usenet.ins.cwru.edu>,
  249. Chad A. Ryan <car11@pop2.cwru.edu> wrote:
  250.  
  251. >To big problem is that I can only read 63 bytes.  I call the "SerGetBuf"
  252. >function to get the number of bytes in the buffer.  If it is less than 63
  253. >bytes it returns the correct value but anything more than that and it returns
  254. >63.  I have also tried getting the number of bytes in the input buffer
  255. >by calling the "PBStatus" and "Status" functions and they also only
  256. >return 63 bytes.
  257.  
  258. The default size of the serial input buffer is 64 bytes.  If you want
  259. a larger buffer, you need to allocate it yourself and tell the serial
  260. driver to use it via a SerSetBuf Control call (csCode 9).
  261.  
  262. Chris.
  263.  
  264. ---------------------------
  265.  
  266. >From TICS28@waccvm.corp.mot.com (Alan Long)
  267. Subject: How to write-read files
  268. Date: 10 Mar 1995 06:27:09 MST
  269. Organization: Motorola
  270.  
  271.      I'm trying to get to grips with how to write to and read from files,
  272. using Think C 6.0.  I've got a Struct in my program, containing Str255,
  273. char and int variables.  I'd simply like to write this Struct to a file,
  274. and read it back into the Struct.
  275.  
  276.      Can someone point me in the right direction?  Do I need to convert
  277. the Struct to a TextEdit record and then write/read?  I don't want to
  278. look up this path if it then turns out to be completely the wrong
  279. strategy.
  280.  
  281.      A few clues would greatly help me to research the details.
  282.  
  283. Regards,
  284. Alan
  285.  
  286. +++++++++++++++++++++++++++
  287.  
  288. >From kurisuto@babel.ling.upenn.edu (Sean Crist)
  289. Date: 10 Mar 1995 17:09:27 GMT
  290. Organization: University of Pennsylvania, Linguistics Department
  291.  
  292. In article <1995Mar10.133618.15142@schbbs.mot.com>,
  293. Alan Long <TICS28@waccvm.corp.mot.com> wrote:
  294. >     I'm trying to get to grips with how to write to and read from files,
  295. >using Think C 6.0.  I've got a Struct in my program, containing Str255,
  296. >char and int variables.  I'd simply like to write this Struct to a file,
  297. >and read it back into the Struct.
  298. >
  299. >     Can someone point me in the right direction?  Do I need to convert
  300. >the Struct to a TextEdit record and then write/read?  I don't want to
  301. >look up this path if it then turns out to be completely the wrong
  302. >strategy.
  303. >
  304. >     A few clues would greatly help me to research the details.
  305.  
  306. Basically, you've got two choices: you can either use the data fork or the
  307. resource fork.  There's difference of opinion on this, but I personally use
  308. the resource fork to store everything; the resource manager is very
  309. convenient to use, and its performance only starts to degrade when you're
  310. handling relatively large amounts of data, or when you're doing something
  311. like a spreadsheet or large-scale database where the format of the file
  312. starts making a crucial difference in time performance.  But if you just
  313. want to store and retrieve a single structure containing a few variables, I
  314. would definitely use the resource manager to do it.
  315.  
  316. I don't know C, but in rough terms, here's what you would do:
  317.  
  318. -Create a handle to your structure with NewHandle, doing the necessary
  319.  typecasting (maybe C doesn't require the typecasting; I don't know.)
  320. -Create and open your resource file, if necessary
  321. -Use AddResource to add your handle as a resource to the file,
  322.  using some custom resource type not used by the system.
  323.  
  324. Read up on the resource manager: once you understand what it's doing, it's
  325. very easy to use.
  326.  
  327.   \/ __ __    _\_     --Sean Crist  (kurisuto@unagi.cis.upenn.edu)
  328.  ---  |  |    \ /     For a free copy of the Bill of Rights, finger
  329.   _| ,| ,|   -----       this account.
  330.   _| ,| ,|    [_]     Q: What do Standard Oil, AT&T, and Microsoft have in
  331.    |  |  |    [_]        common?   A:  Nothing... yet.
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338. +++++++++++++++++++++++++++
  339.  
  340. >From deline@netcom.com (James Deline)
  341. Date: Sun, 12 Mar 1995 05:18:47 GMT
  342. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  343.  
  344. Alan,
  345.  
  346. Learn how to use the standard library routines, it makes life a whole lot 
  347. simpler.  Here's how:
  348.  
  349. #include <stdio.h>
  350.  
  351. FILE    *myfile;
  352. int     result;
  353. size_t  numwritten;
  354. struct mystruct {
  355. Str255  s;
  356. char    c;
  357. int     i;
  358. } mystruct;
  359.  
  360. myfile = fopen ("filename", "w");       // open file for writing
  361. // error check here
  362. numwritten = fwrite (&mystruct, sizeof(mystruct), 1, myfile); // write one
  363. result = fclose (myfile);       // close the file
  364.  
  365. //////////////////
  366.  
  367. It's just that easy, with the caveat that the file will be created in the 
  368. same directory as your program, and when you use fread to read it, it 
  369. must also be in the same directory.  If it's not, you will have to get a 
  370. little more fancy.
  371.  
  372. -- 
  373. //////////////////////////////////////////
  374. James Deline, Ph.D.
  375. Chemist and part-time software writer
  376. My opinions are not necessarily my own
  377. //////////////////////////////////////////
  378.  
  379.  
  380. +++++++++++++++++++++++++++
  381.  
  382. >From peter@mail.peter.com.au (Peter N Lewis)
  383. Date: Thu, 16 Mar 1995 13:45:56 +0800
  384. Organization: Curtin University
  385.  
  386. In article <3jq147$88v@netnews.upenn.edu>, kurisuto@babel.ling.upenn.edu
  387. (Sean Crist) wrote:
  388.  
  389. >-Create a handle to your structure with NewHandle, doing the necessary
  390. > typecasting (maybe C doesn't require the typecasting; I don't know.)
  391.  
  392. Actually, use PtrToHand, which takes a ptr to your struct, and the size of
  393. the struct and returns you a brand new handle.
  394.  
  395. PtrToHand, PtrToXHand, HandAndHand, HandToHand, and of course Munger are
  396. underused by most programmers.  Take a few minutes to read up on these
  397. routines (well, a few hours for Munger, my absolute favouritist call :-)
  398.  
  399. >-Create and open your resource file, if necessary
  400. >-Use AddResource to add your handle as a resource to the file,
  401. > using some custom resource type not used by the system.
  402. >
  403. >Read up on the resource manager: once you understand what it's doing, it's
  404. >very easy to use.
  405.  
  406. I'm not sure I can agree with that statement.  The Resource Manager is
  407. filled with gotchas.  Practically every operation is has problems with
  408. it.  Adding a resource is one, since AddResource does not overwrite an
  409. existing resource with the same ID, so replacing a resource it a
  410. nightmare.
  411.  
  412. Here's some code to write a resource:
  413.  
  414.       SetResLoad(false);
  415.       resfile := FSpOpenResFile(res.fs, fsRdWrPerm);
  416.       err := ResError;
  417.       SetResLoad(true);
  418.       if err = noErr then begin
  419.          h := Get1Resource(res.typ, res.id);
  420.          if h <> nil then begin
  421.             RmveResource(h);
  422.          end;
  423.          AddResource(res.data, res.typ, res.id, res.name);
  424.          err := ResError;
  425.          if err = noErr then begin
  426.             WriteResource(res.data);
  427.             SetResAttrs(res.data, res.attributes);
  428.             err := ResError;
  429.             DetachResource(res.data);
  430.          end;
  431.          CloseResFile(resfile);
  432.       end;
  433.  
  434. Note the gotchas in this code:
  435.  
  436. SetResLoad(false) stops the Resource Manager from filling your heap with
  437. any resources marked preload (I failed to remember this one just
  438. recently).  Be careful to quickly set it back to true - if you cause a
  439. segment load while SetResLoad is false, you'll crash and burn.
  440.  
  441. Then it gets and removes the resource if it exists already (an alternative
  442. is to get the resource, change the data and then write it back).
  443.  
  444. Then it adds the resource.  If this succeeds, then the handle is now a
  445. resource handle, if it fails, the handle is still a memory handly. Be very
  446. careful, you must resolve this dichotomy otherwise you'll never be able to
  447. correctly dispose of the handle (DisposeHandle/ReleaseResource).
  448.  
  449. Write the resource
  450.  
  451. Set the resource attributes if necessary.
  452.  
  453. Detach the resource to ensure we know that the handle is a memory handle
  454. again, so we can finish with handle by calling DisposeHandle.  Another
  455. option is to set res.data to nil and let the CloseResFile ReleaseResource
  456. the handle for you, and then DisposeHandle(res.data) (DisposeHandle is
  457. nil-safe.  DisposePtr is not).
  458.  
  459. Close the resfile (which would have ReleaseResourced the handle if we
  460. hadn't detached it).
  461.  
  462. Enjoy,
  463.    Peter.
  464. -- 
  465. The best movie I've seen recently is "Heavenly Creatures" from New Zealand
  466.  
  467. ---------------------------
  468.  
  469. >From berntson@oeb.harvard.edu (Glenn M. Berntson)
  470. Subject: Large Resource Files
  471. Date: Mon, 13 Mar 1995 09:31:56 -0400
  472. Organization: Harvard University
  473.  
  474. I have an application whose RAM partition size I'd like to keep as small
  475. as possible.  However, one of the things this application does is allow
  476. the user to modify SIZE resources of other applications (thanks to
  477. suggestion of Manfred Wuttke).
  478.  
  479. The problem I face is that in order to get at the SIZE resources, I have
  480. to open the application's resource fork.  I am currently using
  481. FSpOpenResFile.  If I don't allocate a large enought RAM partition to my
  482. own application, opening a large applications resource fork gives me a
  483. system error #25.
  484.  
  485. As I see it, I have two options:
  486.  
  487. 1 - figure out a way to load A SINGLE resource from a resource fork
  488. without opening the entire file.
  489.  
  490. 2 - determine the size of the resource fork prior to calling
  491. FSpOpenResFile to see if an error # 25 would occur and not open the file
  492. if it would.
  493.  
  494. At this stage I can't figure out how to do either of these operations.
  495.  
  496. Any suggestions would be really helpful.
  497.  
  498. Thanks!!
  499.  
  500. Glenn
  501.  
  502. +++++++++++++++++++++++++++
  503.  
  504. >From reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  505. Date: Mon, 13 Mar 1995 17:12:00 GMT
  506. Organization: Rijksuniversiteit Utrecht
  507.  
  508. In article <berntson-1303950931560001@bloeb-mac9.harvard.edu>,
  509. berntson@oeb.harvard.edu (Glenn M. Berntson) wrote:
  510.  
  511. > 1 - figure out a way to load A SINGLE resource from a resource fork
  512. > without opening the entire file.
  513. First, do a SetResLoad( false). Then call FSpOpenResFile. This prevents
  514. the OpenResFile from loading in resources with the 'preloaded' bit set.
  515. This is what causes the out of memory error.
  516. After this, do SetResLoad( true), and call Get1Resource( 'SIZE', ...),
  517. or whatever you do (Count1Resources, ...)
  518. The SetResload and FSpOpenResFiles should be as close together as possible,
  519. to prevent nasty surprises.
  520.  
  521. Reinder Verlinde
  522.  
  523. +++++++++++++++++++++++++++
  524.  
  525. >From mclow@coyote.csusm.edu (Marshall Clow)
  526. Date: 16 Mar 1995 06:45:29 GMT
  527. Organization: Aladdin Systems
  528.  
  529. In article <berntson-1303950931560001@bloeb-mac9.harvard.edu>,
  530. berntson@oeb.harvard.edu (Glenn M. Berntson) wrote:
  531.  
  532. > I have an application whose RAM partition size I'd like to keep as small
  533. > as possible.  However, one of the things this application does is allow
  534. > the user to modify SIZE resources of other applications (thanks to
  535. > suggestion of Manfred Wuttke).
  536. > The problem I face is that in order to get at the SIZE resources, I have
  537. > to open the application's resource fork.  I am currently using
  538. > FSpOpenResFile.  If I don't allocate a large enought RAM partition to my
  539. > own application, opening a large applications resource fork gives me a
  540. > system error #25.
  541. [ snip ]
  542. > Any suggestions would be really helpful.
  543.  
  544. I see two problems that you may be having:
  545.  
  546. 1) When you open a resource file, all the resources marked as 'preload'
  547. get loaded. This is easy to fix. Call ResLoad(false) before the open, and
  548. ResLoad(true) after. No resources will be loaded.
  549.  
  550. 2) The other problem is a bit more involved, but is quite likely what is
  551. going on. Suppose you open a resource file, then call a routine in another
  552. segment (that is not currently loaded) What happens? Well, _LoadSeg does a
  553. GetResource ( 'CODE, n), which loads a resource FROM THE FILE THAT YOU
  554. JUST OPENED, and jumps to the correct offset in that resource for the
  555. routine in your application. Boom.
  556.     The way to solve this is to mange the resource map chain yourself.
  557. After you have opened the file, do a UseResFile back to your application.
  558. When you want to load a resource from the file you are working on you do:
  559.  
  560.    short saveResFile;
  561.  
  562.    saveResFile = CurResFile ();
  563.    UseResFile ( rsrcForkRefNum );
  564.    h = Get1Resource ( ... );
  565.    UseResFile ( saveResFile );
  566.  
  567. This will load a resource from the file with refNum "rsrcForkRefNum".
  568.  
  569. [ Except of course, if the file is the system file, or a font file, or
  570. ROM, or, or, or... Thanks a lot, Dean. ]
  571.  
  572. -- Marshall
  573.  
  574. -- 
  575. Marshall Clow
  576. Aladdin Systems
  577. mclow@coyote.csusm.edu
  578.  
  579. ---------------------------
  580.  
  581. >From dougw@highz.as.arizona.edu (Doug Williams)
  582. Subject: Making an Edit Text Inactive
  583. Date: 13 Mar 1995 03:59:17 GMT
  584. Organization: University of Arizona, Tucson, AZ
  585.  
  586. Is there a clean way to make an Edit Text item in a modal dialog
  587. inactive?  HiliteControl doesn't work, because it really doesn't have
  588. access to a true control.  I pulled something called DialogBits off an
  589. Apple server a while ago, and it's method was as follows: set up a
  590. user item which covers the Edit Text.  If the field should be
  591. inactive, it will paint the rect in notPatBic mode.  Then in the
  592. filter proc, it fakes the Dialog Manager into ignoring clicks in the
  593. Edit Text.  I have two problems with this method: 1) I can see the
  594. text get drawn first regularly, then get greyed out (possibly because
  595. I have a user item with an involved drawing scheme inbetween the Edit
  596. Text and its associated User Item). 2) This scheme makes the greyed
  597. out text look dithered, instead of using a nice grey.
  598.  
  599. So, is there a cleaner way of making an Edit Text Item in a modal
  600. dialog inactive??
  601.  
  602. -=-doug-=-
  603.  
  604.  
  605.  
  606. +++++++++++++++++++++++++++
  607.  
  608. >From mhgrueter@aol.com (MHGrueter)
  609. Date: 15 Mar 1995 12:50:29 -0500
  610. Organization: America Online, Inc. (1-800-827-6364)
  611.  
  612. >> Is there a clean way to make an Edit Text item in a modal dialog
  613. inactive?
  614.  
  615. Doug,
  616.  
  617. I was just looking for something similar yesterday, and I found some code
  618. called "DimText 2.0" on the Apprentice (release 2) CD ROM.  It looks like
  619. what you want.  You can also get it via FTP.  Here is the blurb that came
  620. up in the CD index:
  621.  
  622.  
  623. DimText 2.0
  624. James Walker
  625. walkerj@math.scarolina.edu
  626. Apprentice:Source Code:C:Libraries:
  627. ftp://ftpbio.bgsu.edu/alt.sources.mac/vol-06/
  628. __________
  629. DimText allows you to dim statText and editText items in a dialog without
  630. any extra dialog items, etc. A demo application is included. To use the
  631. "Dim_text()" function, your dialog can't be using the refCon field or
  632. QuickDraw bottleneck. (Not a big deal, IMHO).  Real "gray" is used if it's
  633. available.
  634.  
  635.  
  636. - Mike
  637.  
  638. +++++++++++++++++++++++++++
  639.  
  640. >From mhgrueter@aol.com (MHGrueter)
  641. Date: 15 Mar 1995 12:50:29 -0500
  642. Organization: America Online, Inc. (1-800-827-6364)
  643.  
  644. >> Is there a clean way to make an Edit Text item in a modal dialog
  645. inactive?
  646.  
  647. Doug,
  648.  
  649. I was just looking for something similar yesterday, and I found some code
  650. called "DimText 2.0" on the Apprentice (release 2) CD ROM.  It looks like
  651. what you want.  You can also get it via FTP.  Here is the blurb that came
  652. up in the CD index:
  653.  
  654.  
  655. DimText 2.0
  656. James Walker
  657. walkerj@math.scarolina.edu
  658. Apprentice:Source Code:C:Libraries:
  659. ftp://ftpbio.bgsu.edu/alt.sources.mac/vol-06/
  660. __________
  661. DimText allows you to dim statText and editText items in a dialog without
  662. any extra dialog items, etc. A demo application is included. To use the
  663. "Dim_text()" function, your dialog can't be using the refCon field or
  664. QuickDraw bottleneck. (Not a big deal, IMHO).  Real "gray" is used if it's
  665. available.
  666.  
  667.  
  668. - Mike
  669.  
  670. ---------------------------
  671.  
  672. >From EleScryer@cybercronx.techwood.org (Rhys EleScryer)
  673. Subject: Need help learning Handles -- Pascal
  674. Date: Wed, 08 Mar 1995 09:11:12 -0500
  675. Organization: The Jourvian Group
  676.  
  677. I am currently trying for the first time in any of my programs to use a handle.
  678. I just don't quite have the hang of it. Here's what I've done:
  679. After putting some text into a string variable (theString):
  680.  
  681. theHandle:= NewHandle(SizeOf(theString));
  682. theHandle^:= @theString;
  683.  
  684. This is just plain wrong. I mean it compiles and runs fine, but I end up
  685. with garbage in my variable. Could some kind soul point me in the right
  686. direction when it comes to these nasty buggers?
  687. TIA!
  688. Jaeson
  689.  
  690. -- 
  691.                                     (EMAIL responces preferred)
  692. http://cybercronx.techwood.org  |  EleScryer@cybercronx.techwood.org 
  693.                                Finger me for my public PGP block.
  694.                      Host of the DaemaCron Cybernet Hub +089427;  
  695.  
  696. +++++++++++++++++++++++++++
  697.  
  698. >From kurisuto@babel.ling.upenn.edu (Sean Crist)
  699. Date: 9 Mar 1995 18:23:36 GMT
  700. Organization: University of Pennsylvania, Linguistics Department
  701.  
  702. In article <EleScryer-0803950911120001@josaiah.sewanee.edu>,
  703. Rhys EleScryer <EleScryer@cybercronx.techwood.org> wrote:
  704. >I am currently trying for the first time in any of my programs to use a
  705. >handle. 
  706. >I just don't quite have the hang of it. Here's what I've done:
  707. >After putting some text into a string variable (theString):
  708. >
  709. >theHandle:= NewHandle(SizeOf(theString));
  710. >theHandle^:= @theString;
  711. >
  712. >This is just plain wrong. I mean it compiles and runs fine, but I end up
  713. >with garbage in my variable. Could some kind soul point me in the right
  714. >direction when it comes to these nasty buggers?
  715. >TIA!
  716.  
  717. The line "theHandle^:= @theString;" is a major no-no.  "@theString" is a
  718. pointer to where your string is stored on the stack.  "TheHandle^" is a
  719. pointer to the memory manager's master pointer to the memory block you
  720. allocated with the call to NewHandle (read that sentence 3 times or so; it
  721. makes more sense if you remember that a handle is a pointer to a pointer).
  722. The memory block referred to by TheHandle^^ is in the heap, not the stack.
  723.  
  724. What you're doing in the no-no line is screwing up the memory manager; as a
  725. result of that line, the memory manager thinks there's a relocatable memory
  726. block in the middle of your stack.  If the memory manager needs to move
  727. things around, it's going to yank stuff right out of your stack and move it
  728. someplace else, which could cause any kind of crash.
  729.  
  730. What is it that you're trying to do?  If you want to _copy_ the contents of
  731. the stack variable 'theString' into the memory block referred to by
  732. TheHandle^^, here's how I'd do it:
  733.  
  734. type
  735.   StringPtr = ^Str255;
  736.   StringHandle = ^StringPtr;
  737. var 
  738.   TheStringHandle : StringHandle;
  739.   OkSoFar : Boolean;
  740. begin
  741.   OkSoFar := TRUE;
  742.   TheStringHandle := StringHandle(NewHandle(SizeOf(Str255)));
  743.   if MemErr <> 0 then
  744.     OkSoFar := FALSE;  
  745.  
  746.   if OkSoFar then
  747.     TheStringHandle^^ := TheString;
  748.  
  749. etc.
  750.  
  751. This, of course, is more verbose than it needs to be, but I'm doing this to
  752. point out several things:
  753. 1) I'm using typecasting to trick Pascal into thinking this regular handle
  754.    is a handle to a Str255.  The memory manager could care less what you
  755.    write into the memory block, but Pascal will give you a type mismatch
  756.    if you try to say MyRegularHandle^^ := TheString.  (Actually, I think
  757.    Macintosh Pascal may already have a handle to a Str255 defined, but I
  758.    just defined it again.)
  759. 2) You _must_ check MemErr to make sure the memory allocation was
  760.    successful.  You will be really sorry if you don't ("A system that's
  761.    designed without failure in mind is sure to"- the original version of
  762.    Murphy's Law).  In this case, if the allocation fails, and you try
  763.    writing to the handle anyway, you'll be writing to some random place
  764.    in memory, causing any kind of crash (perhaps not immediately).
  765.          Everyone has their own way of dealing with the failure;
  766.    my way, as I've demonstrated, is to set an OkSoFar boolean to TRUE at
  767.    the beginning of the routine, and to set it to FALSE as soon as there is
  768.    a fatal failure somewhere.  I bracket all my code into meaningful
  769.    paragraphs which start with 'if OkSoFar then begin...'; if there's been
  770.    a failure, I'll just fall through to the end of the routine.  Of course,
  771.    you'll want to have some kind of error reporting, but I haven't
  772.    demonstrated this here; write to me if you want some suggestions on
  773.    how to do this efficiently.  Also, sometimes there will be extra things
  774.    you need to do to handle a failure, but the technique I've used here
  775.    covers a lot of the ordinary cases.
  776.  
  777. Hope this helps.
  778.  
  779.   \/ __ __    _\_     --Sean Crist  (kurisuto@unagi.cis.upenn.edu)
  780.  ---  |  |    \ /     For a free copy of the Bill of Rights, finger
  781.   _| ,| ,|   -----       this account.
  782.   _| ,| ,|    [_]     Q: What do Standard Oil, AT&T, and Microsoft have in
  783.    |  |  |    [_]        common?   A:  Nothing... yet.
  784.  
  785. +++++++++++++++++++++++++++
  786.  
  787. >From jaks@netcom.com (Eric Jackson)
  788. Date: Fri, 10 Mar 1995 18:00:03 GMT
  789. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  790.  
  791. In article <EleScryer-0803950911120001@josaiah.sewanee.edu>,
  792. Rhys EleScryer <EleScryer@cybercronx.techwood.org> wrote:
  793. >I am currently trying for the first time in any of my programs to use a
  794. >handle.
  795. >I just don't quite have the hang of it. Here's what I've done:
  796. >After putting some text into a string variable (theString):
  797. >
  798. >theHandle:= NewHandle(SizeOf(theString));
  799. >theHandle^:= @theString;
  800. >
  801. >This is just plain wrong. I mean it compiles and runs fine, but I end up
  802. >with garbage in my variable. Could some kind soul point me in the right
  803. >direction when it comes to these nasty buggers?
  804. >TIA!
  805. Another way to get a string handle is with this function
  806.  
  807. Function NewString(theString:str255):StringHandle;
  808. You will find it under tool box utilities on page 468
  809. of the old inside machintosh volume one and I think it must
  810. also be somewhere in the new versions as well.
  811.  
  812. Eric Jackson
  813. jaks@netcom.com
  814.  
  815.  
  816. +++++++++++++++++++++++++++
  817.  
  818. >From ingemar@lysator.liu.se (Ingemar Ragnemalm)
  819. Date: 12 Mar 1995 09:36:52 GMT
  820. Organization: (none)
  821.  
  822. kurisuto@babel.ling.upenn.edu (Sean Crist) writes:
  823.  
  824. >In article <EleScryer-0803950911120001@josaiah.sewanee.edu>,
  825. >Rhys EleScryer <EleScryer@cybercronx.techwood.org> wrote:
  826. >>I am currently trying for the first time in any of my programs to use a
  827. >>handle. 
  828. >>I just don't quite have the hang of it. Here's what I've done:
  829. >>After putting some text into a string variable (theString):
  830. >>
  831. >>theHandle:= NewHandle(SizeOf(theString));
  832. >>theHandle^:= @theString;
  833. >>
  834. >>This is just plain wrong. I mean it compiles and runs fine, but I end up
  835. >>with garbage in my variable. Could some kind soul point me in the right
  836. >>direction when it comes to these nasty buggers?
  837. >>TIA!
  838.  
  839. Yes, it's just plain wrong. If you want to copy the string into the
  840. handle, I would try
  841.  
  842. if theHandle <> nil then
  843.   StringHandle(theHandle)^^ := theString;
  844.  
  845. >type
  846. >  StringPtr = ^Str255;
  847. >  StringHandle = ^StringPtr;
  848.  
  849. Note that those types are predeclared in "general-purpose data types" so you
  850. don't have to.
  851.  
  852. --
  853. - -
  854. Ingemar Ragnemalm, PhD
  855. Image processing, Mac shareware games
  856. E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se
  857.  
  858. +++++++++++++++++++++++++++
  859.  
  860. >From eesau@uta.fi (Esa Ristil{)
  861. Date: 10 Mar 1995 16:10:43 +0200
  862. Organization: University of Tampere, Finland
  863.  
  864. According to Rhys EleScryer:
  865. >theHandle:= NewHandle(SizeOf(theString));
  866. >theHandle^:= @theString;
  867.  
  868. Handles needs to be dereferenced twice, that is
  869. theHandle^^ := @theString
  870.  
  871. If there is only one ^ you will be pointing to the handle's
  872. masterpointer and that is a no no.
  873.  
  874. -- 
  875.          Esa Ristild         *         http://www.uta.fi/~eesau/
  876.          eesau@uta.fi        *         Homo homini lupus
  877.  
  878. +++++++++++++++++++++++++++
  879.  
  880. >From David Shortt <wyatt@wyatt.com>
  881. Date: 13 Mar 1995 09:00:30 GMT
  882. Organization: RAIN Public Access Internet (805) 967-RAIN
  883.  
  884. EleScryer@cybercronx.techwood.org (Rhys EleScryer) wrote:
  885. >
  886. > I am currently trying for the first time in any of my programs to use a handle.
  887. > I just don't quite have the hang of it. Here's what I've done:
  888. > After putting some text into a string variable (theString):
  889. > theHandle:= NewHandle(SizeOf(theString));
  890. > theHandle^:= @theString;
  891. > This is just plain wrong. I mean it compiles and runs fine, but I end up
  892. > with garbage in my variable. Could some kind soul point me in the right
  893. > direction when it comes to these nasty buggers?
  894. > TIA!
  895. > Jaeson
  896.  
  897. The first thing to remember about a handle is that it is a pointer to a
  898. pointer.  If you had a string pointer called myStrPointer, you could fill
  899. it like this:
  900.  
  901.   var
  902.     theString: Str255;
  903.     myStrPointer: StringPtr;
  904.  
  905.   begin
  906.     theString:= 'abcdefghijklmnopqrstuvwxyz';  {any text}
  907.     myStrPointer:= StringPtr(NewPtr(SizeOf(Str255)));
  908.     myStrPointer^:= theString;
  909.  
  910. This works because myStrPointer is a pointer to a str255, so
  911. myStrPointer^ is a str255; therefore myStrPointer^ can be set equal to
  912. another string.  Note: always allocate enough space for the biggest
  913. possible string, just to be safe.  You could also write
  914.  
  915.   myStrPointer:= @theString;
  916.  
  917. In this case you're setting two pointers equal.
  918.  
  919. Now let's do a handle.  I would write it like this:
  920.  
  921.   var
  922.     theString: Str255;
  923.     myStrHandle: StringHandle;
  924.  
  925.   begin
  926.     theString:= 'abcdefghijklmnopqrstuvwxyz';  {any text}
  927.     myStrHandle:= StringHandle(NewHandle(SizeOf(Str255)));
  928.     myStrHandle^^:= theString;
  929.  
  930. The final line works because you first de-reference the handle once to
  931. create a pointer, then de-reference a second time to make the string
  932. itself.  You can then assign this to any string.  In this case you CANNOT
  933. do something like this:
  934.  
  935.     myStrHandle:= @@theString;  {don't do this!}
  936.  
  937. because you can't just make a handle out of a variable.  Also, don't
  938. forget to dispose of the handle you created when you're done, like this:
  939.  
  940.     DisposeHandle(Handle(myStrHandle));  {sometimes named DisposHandle}
  941.     myStrHandle:= nil;
  942.  
  943. I always set a handle (or a pointer) back to nil when I dispose of it.
  944. That way if I accidentally access it again (illegally), it generates a
  945. more predictable error.
  946.  
  947. If you've never used handles before, you may wonder why bother.  The
  948. reason is that when you create a handle, the operating system keeps track
  949. of the handle, _and_ an internal pointer which actually points to the
  950. data.  Now let's suppose you allocate a lot of handles for long arrays of
  951. numbers, for storing a picture or something.  If you allocate and
  952. deallocate different length arrays in different orders, your memory can
  953. become fragmented.  If they're all pointers, there is nothing the
  954. operating system can do, except fail at some point :(.  But if they're
  955. handles, the operating system can move memory around and change the value
  956. of the "master pointer" for each handle.  In our example, the value of
  957. myStrHandle never changes, but the operating system can change the value
  958. of myStrHandle^ if it wants to, as long as it moves the data around to
  959. match.  This way, the OS can compact memory as long as everything is
  960. handles.  This happens, if necessary, whenever you call NewHandle.
  961. Pretty neat!  I was fascinated when I found this out, and remember, the
  962. Mac has been doing this since 1984!
  963.  
  964. Sometimes you need to have a pointer, not a handle.  This can happen if
  965. you want to pass a pointer to some data to an operating system routine.
  966. In this case it is wise to "lock" the handle before passing it's
  967. de-referenced pointer:
  968.  
  969.     HLock(myStrHandle);
  970.     myStrPtr:= myStrHandle^;  {de-reference once to get master pointer}
  971.     ProcedureWhichTakesAPointer(myStrPtr);
  972.     HUnlock(myStrHandle);
  973.  
  974. Locking the handle tells the operating system not to move that handle's
  975. memory around.  If it moved memory around after you were playing with the
  976. pointer, it could be a disaster.
  977.  
  978. That's about all I know about handles.  I recommend the book _Macintosh
  979. Programming Primer_ by Dave Mark and Cartright Reed.  It uses THINK
  980. Pascal.  They also have two books with similar titles using C.  I hope
  981. this helps.
  982.  
  983. Dave Shortt
  984. wyatt@wyatt.com
  985.  
  986.  
  987.  
  988. +++++++++++++++++++++++++++
  989.  
  990. >From mxmora@unix.sri.com (Matthew Xavier Mora)
  991. Date: Wed, 15 Mar 1995 10:18:23 -0800
  992. Organization: SRI International
  993.  
  994. In article <EleScryer-0803950911120001@josaiah.sewanee.edu>,
  995. EleScryer@cybercronx.techwood.org (Rhys EleScryer) wrote:
  996.  
  997. >I am currently trying for the first time in any of my programs to use a handle.
  998. >I just don't quite have the hang of it. Here's what I've done:
  999. >After putting some text into a string variable (theString):
  1000. >
  1001. >theHandle:= NewHandle(SizeOf(theString));
  1002. >theHandle^:= @theString;
  1003.  
  1004. Yeow!
  1005.  
  1006. Try :
  1007.  
  1008. oe:=PtrToHand(Ptr(@theString),theHandle,length(theString)+1);
  1009.  
  1010. or
  1011.  
  1012. theHandle := NewHandle(0);
  1013. oe := PtrAndHand(Ptr(@theString),theHandle,length(theString)+1);
  1014.  
  1015. if you don't want the length byte in the handle then do a 
  1016. Ptr(ord(@theString)+1) and don't add one to the length.
  1017.  
  1018.  
  1019.  
  1020. Xavier
  1021.  
  1022. -- 
  1023. __________________________________________________________________
  1024. Matthew Xavier Mora  (cybernaut)            The keeper of the UMPG
  1025. SRI International                              mxmora@unix.sri.com
  1026.                 
  1027. "Indeed, it would not be an exaggeration to describe the history 
  1028. of the computer industry for the past decade as a massive attempt
  1029. to keep up with Apple." Byte 12/94 
  1030.  
  1031. +++++++++++++++++++++++++++
  1032.  
  1033. >From peter@mail.peter.com.au (Peter N Lewis)
  1034. Date: Thu, 16 Mar 1995 12:15:47 +0800
  1035. Organization: Curtin University
  1036.  
  1037. In article <EleScryer-0803950911120001@josaiah.sewanee.edu>,
  1038. EleScryer@cybercronx.techwood.org (Rhys EleScryer) wrote:
  1039.  
  1040. >I am currently trying for the first time in any of my programs to use a handle.
  1041. >I just don't quite have the hang of it. Here's what I've done:
  1042. >After putting some text into a string variable (theString):
  1043. >
  1044. >theHandle:= NewHandle(SizeOf(theString));
  1045. >theHandle^:= @theString;
  1046. >
  1047. >This is just plain wrong. I mean it compiles and runs fine, but I end up
  1048. >with garbage in my variable. Could some kind soul point me in the right
  1049. >direction when it comes to these nasty buggers?
  1050.  
  1051. Well, here are some dos and donts.
  1052.  
  1053. First off, a Handle is more than just a pointer to a pointer.  The Memory
  1054. manager knows about handles and does magical things with them like moving
  1055. them around your heap if you let them (to avoid fragmentation), resizing
  1056. them and so on.  You should never make "fake" handles, which are simply
  1057. pointers to pointers.  Also, you should never manipulate h^ (like you're
  1058. doing above).
  1059.  
  1060. You could do what you want with:
  1061.  
  1062. h:=NewHandle(SizeOf(Str255));
  1063. StringHandle(h)^^:=s;
  1064.  
  1065. But probably better is:
  1066.  
  1067. h:=NewHandle(length(s)+1);
  1068. BlockMoveData(@s,h^,length(s)+1);
  1069.  
  1070. The difference is that instead of a 256 byte handle with a small string at
  1071. the end of it, you have a small handle that just fits the string (the +1
  1072. is to add room for the length byte).
  1073.  
  1074. Of course, the best way to do this is:
  1075.  
  1076. SetString(StringHandle(h),s);
  1077.  
  1078. Which lets the OS figure it out for you, but that's not very informative.
  1079.  
  1080. For the truely daring, you could use munger on a given handle:
  1081.  
  1082. junk_long:=Munger(h,0,nil,GetHandleSize(h),@s,length(s)+1);
  1083.  
  1084. One further thing to always remember about handles is the difference
  1085. between memory handles and resource handles.  It is vitally improtant you
  1086. keep track of which handles are which.  When you get a resource (using
  1087. GetResource for example), you are returned a resource handle.  This has
  1088. all the special properties of a memory handle, but is also known by the
  1089. resource manager to be a resource handle.  You must NOT DisposeHandle it,
  1090. because then the resource manager would still remember it.  You need to
  1091. get rid of it using ReleseResource.  Also, if you close the resource file
  1092. the resource handle comes from, the resource will be automatically
  1093. released by the resource manager (making the handle invalid, so you can't
  1094. use it after that).  You can turn a resource handle into a regular memoyr
  1095. handle using DetachResource.  The reverse can be done using AddResource,
  1096. which takes a memory handle and adds it to a resource file, turning the
  1097. memory handle into a resource handle at the same time.
  1098.  
  1099. It's all very complicated, but you should get the hang of it after a
  1100. while.  Two useful inits DoubleTrouble and DisposeResource can be very
  1101. helpful at tracking down problems, they drop you into macsbug when you
  1102. DisposeHandle a resource handle, or DisposeHandle a handle you've already
  1103. disposed.
  1104.  
  1105. Enjoy,
  1106.    Peter.
  1107. -- 
  1108. The best movie I've seen recently is "Heavenly Creatures" from New Zealand
  1109.  
  1110. ---------------------------
  1111.  
  1112. >From stack@starnine.com (Michael Tank Stack)
  1113. Subject: OSAExecute and AS subroutines
  1114. Date: Fri, 03 Mar 1995 08:52:36 -0800
  1115. Organization: StarNine Technologies, Inc.
  1116.  
  1117. I am having a little difficulty w/ OSAExecute and Applescripts and was
  1118. wondering if anyone else had come across the same behavior?
  1119.  
  1120. If I write an applescript with sub-routines calls and compile it in
  1121. script-editor, in my program I can use OSALoad and OSAExecute to run the
  1122. script w/o problem.
  1123.  
  1124. If I pass the same script as text to OSACompile and subsequently to
  1125. OSAExecute, the script fails  at the call to the sub-routine w/ a "<<My
  1126. Script Name>> doesn't understand the <My Sub-Routine Name> message." and a
  1127. -1708 error. The same code will not fail if the script is written straight
  1128. w/o sub-routines.
  1129.  
  1130. I've tried a few things such as the qualifier "of me" etc. and wandering
  1131. through doc sheds but to little effect.  Any help or pointers would be
  1132. much appreciated.
  1133.  
  1134. Thanks,
  1135.  
  1136. St.Ack
  1137.  
  1138. +++++++++++++++++++++++++++
  1139.  
  1140. >From jonpugh@netcom.com (Jon Pugh)
  1141. Date: Fri, 10 Mar 1995 01:05:02 GMT
  1142. Organization: Will hack for food
  1143.  
  1144. Michael Tank Stack (stack@starnine.com) wrote:
  1145.  
  1146. > If I write an applescript with sub-routines calls and compile it in
  1147. > script-editor, in my program I can use OSALoad and OSAExecute to run the
  1148. > script w/o problem.
  1149.  
  1150. > If I pass the same script as text to OSACompile and subsequently to
  1151. > OSAExecute, the script fails  at the call to the sub-routine w/ a "<<My
  1152. > Script Name>> doesn't understand the <My Sub-Routine Name> message." and a
  1153. > -1708 error. The same code will not fail if the script is written straight
  1154. > w/o sub-routines.
  1155.  
  1156. I'll bet you aren't using the OSAModeCompileIntoContext flag on OSACompile.
  1157. You need to use this when compiling a script so that things get set up 
  1158. properly.
  1159.  
  1160. Jon
  1161.  
  1162.  
  1163. +++++++++++++++++++++++++++
  1164.  
  1165. >From Patrick C. Beard <beard@cs.ucdavis.edu>
  1166. Date: 11 Mar 1995 02:23:52 GMT
  1167. Organization: Computing Research Group
  1168.  
  1169. In article <stack-0303950852360001@stacklc.starnine.com> Michael Tank Stack, stack@starnine.com
  1170. writes:
  1171. >I am having a little difficulty w/ OSAExecute and Applescripts and was
  1172. >wondering if anyone else had come across the same behavior?
  1173. >
  1174. >If I write an applescript with sub-routines calls and compile it in
  1175. >script-editor, in my program I can use OSALoad and OSAExecute to run the
  1176. >script w/o problem.
  1177. >
  1178. >If I pass the same script as text to OSACompile and subsequently to
  1179. >OSAExecute, the script fails  at the call to the sub-routine w/ a "<<My
  1180. >Script Name>> doesn't understand the <My Sub-Routine Name> message." and a
  1181. >-1708 error. The same code will not fail if the script is written straight
  1182. >w/o sub-routines.
  1183.  
  1184. Here's a little class I whipped up a while back to make it easier to work
  1185. with OSA scripts. Hopefully this will help others out too. Here's how you
  1186. could use this class:
  1187.  
  1188. #include "OSAScript.h"
  1189.  
  1190. static char* initScript = "\r\
  1191. on fact(n)\r\
  1192.         if n <= 1 then\r\
  1193.                 return 1\r\
  1194.         else\r\
  1195.                 return n * fact(n - 1)\r\
  1196.         end if\r\
  1197. end fact\r"; 
  1198.  
  1199. void main()
  1200. {
  1201.         printf("testing OSAScript.\n");
  1202.         OSAScript script(initScript);
  1203.         script.Compile("fact(10)");
  1204.         printf("fact(100) = %s\n", script.Execute());
  1205. }
  1206.  
  1207. // author:          Patrick C. Beard
  1208. // organization:    Computing Research Group
  1209. // e-mail:          beard@cs.ucdavis.edu
  1210.  
  1211. /*
  1212.         OSAScript.h
  1213.         
  1214.         A class for managing OSA Scripts.
  1215.         
  1216.         by Patrick C. Beard.
  1217.  */
  1218.  
  1219. #ifndef __OSA_SCRIPT__
  1220. #define __OSA_SCRIPT__
  1221.  
  1222. #include <OSA.h>
  1223.  
  1224. class OSAScript {
  1225. public:
  1226.         OSAScript(char* initScript = nil);
  1227.         ~OSAScript();
  1228.         
  1229.         void Compile(const char* script);
  1230.         const char* Execute(void);
  1231.         OSErr Result() { return itsResult; }
  1232.         
  1233. private:
  1234.         OSErr itsResult;
  1235.         OSAID itsScriptContext;
  1236.         AEDesc itsScriptResult;
  1237. };
  1238.  
  1239. #endif
  1240.  
  1241. /*
  1242.         OSAScript.cp
  1243.         
  1244.         A class for managing OSA Scripts.
  1245.         
  1246.         by Patrick C. Beard.
  1247.  */
  1248.  
  1249. #include "OSAScript.h"
  1250. #include <string.h>
  1251.  
  1252. static ComponentInstance theComponent= nil;
  1253. static short theScriptCount = 0;
  1254.  
  1255. OSAScript::OSAScript(char* initScript)
  1256. {
  1257.         if (!theComponent)
  1258.                 theComponent = OpenDefaultComponent(kOSAComponentType, kOSAGenericScriptingComponentSubtype);
  1259.         ++theScriptCount;
  1260.  
  1261.         itsResult = noErr;
  1262.         itsScriptContext = kOSANullScript;
  1263.         itsScriptResult.descriptorType = typeNull;
  1264.         itsScriptResult.dataHandle = nil;
  1265.         
  1266.         // precompile a context to hold variable bindings, etc.
  1267.         if (initScript) Compile(initScript);
  1268. }
  1269.  
  1270. OSAScript::~OSAScript()
  1271. {
  1272.         if (itsScriptResult.descriptorType != typeNull)
  1273.                 AEDisposeDesc(&itsScriptResult);
  1274.         
  1275.         if (itsScriptContext != kOSANullScript) {
  1276.                 OSADispose(theComponent, itsScriptContext);
  1277.                 itsScriptContext = kOSANullScript;
  1278.         }
  1279.         
  1280.         // if last script in existence, tear down the component.
  1281.         if (--theScriptCount == 0 && theComponent != nil) {
  1282.                 CloseComponent(theComponent);
  1283.                 theComponent = nil;
  1284.         }
  1285. }
  1286.  
  1287. void OSAScript::Compile(const char* script)
  1288. {
  1289.         AEDesc scriptDesc;
  1290.         scriptDesc.descriptorType = typeChar;
  1291.         PtrToHand(script, &scriptDesc.dataHandle, strlen(script));
  1292.         itsResult = OSACompile(theComponent, &scriptDesc, kOSAModeAugmentContext, &itsScriptContext);
  1293.         AEDisposeDesc(&scriptDesc);
  1294. }
  1295.  
  1296. static const char* AEDescToCString(AEDesc& desc)
  1297. {
  1298.         if (desc.descriptorType != typeChar)
  1299.                 return nil;
  1300.         
  1301.         Handle textH = desc.dataHandle;
  1302.         long textSize = GetHandleSize(textH);
  1303.         SetHandleSize(textH, 1 + textSize);
  1304.         HLock(textH);
  1305.         
  1306.         char* str = *textH;
  1307.         str[textSize] = '\0';
  1308.  
  1309.         return str;
  1310. }
  1311.  
  1312. const char* OSAScript::Execute()
  1313. {
  1314.         OSAID scriptValue;
  1315.         
  1316.         // dispose of any previous result text.
  1317.         if (itsScriptResult.descriptorType != typeNull)
  1318.                 AEDisposeDesc(&itsScriptResult);
  1319.         
  1320.         // execute the result in its own context. this augments the environment.
  1321.         itsResult = OSAExecute(theComponent, itsScriptContext, itsScriptContext,
  1322.                                                 kOSAModeAlwaysInteract, &scriptValue);
  1323.         
  1324.         // check for errors.
  1325.         if (itsResult != noErr) {
  1326.                 itsResult = OSAScriptError(theComponent, kOSAErrorMessage, typeChar, &itsScriptResult);
  1327.         } else {
  1328. #if 1
  1329.                 itsResult = OSADisplay(theComponent, scriptValue, typeChar,
  1330.                                                         kOSAModeNull, &itsScriptResult);
  1331. #else
  1332.                 itsResult = OSADisplay(theComponent, scriptValue, typeChar,
  1333.                                                         kOSAModeDisplayForHumans, &itsScriptResult);
  1334. #endif
  1335.                 OSADispose(theComponent, scriptValue);
  1336.         }
  1337.         
  1338.         return AEDescToCString(itsScriptResult);
  1339. }
  1340.  
  1341. ---------------------------
  1342.  
  1343. >From altura@aol.com (ALTURA)
  1344. Subject: [Ann] FREE QuickView Development Kit
  1345. Date: 17 Mar 1995 13:02:24 -0500
  1346. Organization: America Online, Inc. (1-800-827-6364)
  1347.  
  1348. FOR IMMEDIATE RELEASE CONTACT:
  1349. Lee Lorenzen, President
  1350. Altura Software, Inc.
  1351. 408.655.8005
  1352.  
  1353. Altura Software Announces QuickView Developer Edition
  1354.  
  1355. PACIFIC GROVE, California -- March 16, 1995 -- Altura Software, Inc.
  1356. announced today that it will be making available its popular QuickView(tm)
  1357. Development Kit for the personal use of developers free of charge.  The
  1358. Kit will appear on the next major release of the Metrowerks CodeWarrior
  1359. CD-ROM and the June 1995 Apple(R) Developer CD Reference Library Edition.
  1360.  
  1361. MAJOR BENEFITS FOR DEVELOPERS
  1362. Developers will be able to create QuickView databases that integrate with
  1363. Apple's Macintosh(R) Programmer's Toolbox Assistant.  Key features of
  1364. these databases are:
  1365.  
  1366. * Hypertext links
  1367. * Graphics, sound and QuickTime Movies
  1368. * Full Text Search Indexing
  1369. * Popup definition windows
  1370. * Sticky notes for annotation
  1371. * Integration with major third-party development environments such as
  1372. Metrowerks CodeWarrior
  1373.  
  1374. Source files created for QuickView are by definition cross-platform
  1375. because QuickView uses the same source file format as Microsoft's popular
  1376. Multimedia Viewer 2.0 on Windows.
  1377.  
  1378. "Metrowerks is working closely with Altura to standardize all online
  1379. CodeWarrior help on QuickView," said Greg Galanos, President and CEO of
  1380. Metrowerks Inc.  "QuickView is a godsend for online help and interactive
  1381. referencing and we're happy to announce that you'll see QuickView
  1382. databases
  1383. for CodeWarrior in the CW6 release. We're also happy to announce that
  1384. Altura will be distributing their QuickView Developer's Kit on CW6."
  1385.  
  1386.  
  1387. QUICKVIEW DEVELOPER EDITION
  1388. Altura has created the QuickView Developer Edition which consists of the
  1389. standard QuickView Development Kit along with beta versions of its newly
  1390. created authoring tools, authoring documentation, and many sample files.  
  1391.  
  1392. Users of the QuickView Developer Edition will have the right to compile
  1393. and view databases for their personal use free of charge.  However, they
  1394. won't be able to redistribute these databases.  Distribution licenses are
  1395. available for an annual flat rate per title (commercial and non-commercial
  1396. pricing is available).  Contact Altura Software for pricing information. 
  1397. Databases created with the Developer Edition have a small "demonstration
  1398. notice" at the beginning of each database topic.
  1399.  
  1400. "The QuickView Developer Edition is a boon to Mac developers because it
  1401. allows them to create documentation for their own code libraries that
  1402. integrate with Apple's Macintosh Programmer's Toolbox Assistant," remarked
  1403. Jordan Zimmerman (one of QuickView's creators).  "Not only is it free, but
  1404. it also provides the same rich feature set that has made Macintosh
  1405. Programmer's Toolbox Assistant so powerful."
  1406.  
  1407.  
  1408. ABOUT QUICKVIEW
  1409. QuickView is a Microsoft Multimedia Viewer-compatible multimedia and
  1410. online reference development tool.  Apple Computer recently used QuickView
  1411. to develop its Macintosh Programmer's Toolbox Assistant.  QuickView
  1412. features:
  1413.  
  1414. * Multimedia support - QuickTime and Sound
  1415. * Graphics support - PICT and PICTs with hotspots
  1416. * Full Text Indexing (query using AND, OR, NOT, NEAR, THRU)
  1417. * Context-sensitivity and Hypertext links
  1418. * Popup Definitions
  1419. * Sticky Notes for annotations
  1420. * Cross-platform (Microsoft Multimedia Viewer 2.0 compatible)
  1421. * Rich macro language
  1422. * Native Mac look-and-feel
  1423.  
  1424. QuickView is fast becoming a standard for online reference and
  1425. cross-platform multimedia on the Mac.  Apple, Microsoft, Claris,
  1426. Metrowerks, and many others are using QuickView.
  1427.  
  1428.  
  1429. ABOUT ALTURA SOFTWARE
  1430. Altura Software, Inc. is a leading developer of porting technology
  1431. solutions for the Macintosh and Windows platforms.  The company's
  1432. Mac2Win(tm) technology gives software developers unparalleled solutions
  1433. for quickly moving their Macintosh applications to Windows.  Altura
  1434. Software also offers QuickHelp(tm), the WinHelp compatible, context
  1435. sensitive help system for Macintosh; and QuickView, the Microsoft
  1436. Multimedia Viewer-compatible multimedia and online reference development
  1437. tool.  Altura Software, Inc. was founded in 1990 and is based in Pacific
  1438. Grove, California.
  1439.  
  1440. For more information on Altura Software and its products, please contact
  1441. Lee Lorenzen at 408-655-8005.
  1442.  
  1443. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  1444.  
  1445. Apple Computer, Inc., a recognized pioneer and innovator in the
  1446. information
  1447. industry, creates powerful solutions based on easy-to-use personal
  1448. computers,
  1449. servers, peripherals, software, online services, and personal digital
  1450. assistants.  Headquartered in Cupertino, California, Apple (NASDAQ: AAPL)
  1451. develops, manufactures, licenses, and markets products, technologies, and
  1452. services for the business, education, consumer, scientific and engineering
  1453. and
  1454. government markets in over 140 countries.
  1455.  
  1456. Founded in 1985, Metrowerks Inc. develops and sells programming tools for
  1457. the Macintosh.  Metrowerks currently has over 9,000 registered users in
  1458. over 40 countries. Metrowerks began publically trading on the Vancouver
  1459. Stock Exchange on March 11, 1994 under the symbol MWK.
  1460.  
  1461. Metrowerks and the Metrowerks logo are registered trademarks of
  1462. Metrowerks, Inc. CodeWarrior is a trademark of Metrowerks, Inc.  Apple,
  1463. Macintosh, and Mac, are registered trademarks of Apple Computer, Inc.  All
  1464. other trademarks and registered trademarks are the property of their
  1465. respective owners.
  1466.  
  1467.  
  1468. ---------------------------
  1469.  
  1470. >From tomservo@iastate.edu (J.A. Safranek)
  1471. Subject: [HELP] How would I add to the Help Menu?
  1472. Date: 8 Mar 95 03:48:10 GMT
  1473. Organization: Iowa State University, Ames, Iowa
  1474.  
  1475. I am making a utility with CW5 and I want to add a help feature to the
  1476. help menu. The problem I am having is I don't know how to add to the
  1477. Help menu. I have the SpInside Mac HyperCard Stack and it has nothing on
  1478. this. I tried adding a 'hmnu' menu with ResEdit and had it add the menu.
  1479. But it just put a hmnu on the menu bar. Can someone please tell me how I
  1480. go about doing this. Thanks.
  1481.  
  1482.     -John A. Safranek
  1483.  
  1484. - ----------------------------------------------------------------------------
  1485.          _   "And that, my friend, is a specialty bread."
  1486.         [ ]   - Tom Servo
  1487.        (   )       -----------------------------------------------------------
  1488.         |>|        Email:         tomservo@iastate.edu
  1489.      __/===\__     WWW Home Page: http://www.public.iastate.edu/~tomservo/
  1490.     //| o=o |\\    -----------------------------------------------------------
  1491.   <]  | o=o |  [>  On Laplace Transforms:
  1492.       \=====/        "They aren't as good as a cold beer. But by God, they
  1493.      / / | \ \        sure do come close!" - C. Comstock
  1494.     <_________>    -----------------------------------------------------------
  1495.                                 Bring back the Tenth Amendment!
  1496. - ----------------------------------------------------------------------------
  1497.  
  1498.  
  1499. +++++++++++++++++++++++++++
  1500.  
  1501. >From rvtaylor@netcom.com (Richard Taylor)
  1502. Date: Thu, 9 Mar 1995 21:11:26 GMT
  1503. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1504.  
  1505. J.A. Safranek (tomservo@iastate.edu) wrote:
  1506. : I am making a utility with CW5 and I want to add a help feature to the
  1507. : help menu. The problem I am having is I don't know how to add to the
  1508. : Help menu. I have the SpInside Mac HyperCard Stack and it has nothing on
  1509. : this. I tried adding a 'hmnu' menu with ResEdit and had it add the menu.
  1510. : But it just put a hmnu on the menu bar. Can someone please tell me how I
  1511. : go about doing this. Thanks.
  1512.  
  1513. Here's how I do it:
  1514.  
  1515. if sysConfig.hasHelpMgr then begin {use gestalt to be sure you have helpMgr}
  1516.    err := HMGetHelpMenuHandle(LocalHelpMenu); {get =your= local handle}
  1517.    if (err = noerr) and (LocalHelpMenu <> nil) then
  1518.     AppendMenu(localHelpMenu, 'Your Help Item Goes Here');
  1519.  
  1520. This adds your item to the Help menu.
  1521.  
  1522. Then when you're processing menu commands include this:
  1523.  
  1524. Case MenuID of
  1525. {your other menus...}
  1526.  
  1527. kHMHelpMenuID: 
  1528.   {do your help menu command}
  1529.  
  1530.  
  1531. You can add more than one and you can get a menu item count but if you
  1532. 're just adding one item the above will work.
  1533.  
  1534. -- 
  1535. richard taylor:     rvtaylor@netcom.com
  1536.  
  1537.  
  1538. +++++++++++++++++++++++++++
  1539.  
  1540. >From cwatson@cam.org (Chris Watson)
  1541. Date: Sat, 11 Mar 1995 17:36:15 -0500
  1542. Organization: Communications Accessibles Montreal, Quebec Canada
  1543.  
  1544. In article <tomservo.794634490@pv663c.vincent.iastate.edu>,
  1545. tomservo@iastate.edu (J.A. Safranek) wrote:
  1546.  
  1547. > I am making a utility with CW5 and I want to add a help feature to the
  1548. > help menu. The problem I am having is I don't know how to add to the
  1549. > Help menu. I have the SpInside Mac HyperCard Stack and it has nothing on
  1550. > this. I tried adding a 'hmnu' menu with ResEdit and had it add the menu.
  1551. > But it just put a hmnu on the menu bar. Can someone please tell me how I
  1552. > go about doing this. Thanks.
  1553.  
  1554. There is a call that returns a handle to the Guide (or Help) menu.  It is
  1555. something like HMGetHelpMenuHandle ()... something like that, check
  1556. Balloons.h
  1557.  
  1558. hope it helps...
  1559.  
  1560.  
  1561. .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.
  1562. |    Chris Watson                                                   |
  1563. |    cwatson@cam.org            Hooked on foniks werkes four me!    |
  1564. |    Montreal, Canada                                               |
  1565. i:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::i
  1566.  
  1567. ---------------------------
  1568.  
  1569. End of C.S.M.P. Digest
  1570. **********************
  1571.  
  1572.  
  1573.  
  1574. Attachment converted: Spiff:ShowInit-7.sit (SITD/SIT!) (0001D423)
  1575.